查看原文
其他

一文参透分布式存储系统Ceph的架构设计、集群搭建

博学谷狂野架构师 SpringForAll 2022-10-20
关注我,回复关键字“spring”

免费领取Spring学习资料

来源 | OSCHINA 社区
链接:https://my.oschina.net/jiagoushi/blog/5560117

1. Ceph 概述

1.1 背景

Ceph 是一个去中心化的分布式存储系统, 提供较好的性能、可靠性和可扩展性。Ceph 项目最早起源于 Sage 就读博士期间的工作(最早的成果于 2004 年发表),并随后贡献给开源社区, 遵循 LGPL 协议(LESSER GENERAL PUBLIC LICENSE 的简写,中文译为 “较宽松公共许可证”)。在经过了数年的发展之后,目前已得到众多云计算厂商(OpenStack、CloudStack、OpenNebula、Hadoop)的支持并被广泛应用。

1.2 介绍

Ceph 是一个可靠、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将 Ceph 分为三大块,分别是对象存储、块设备和文件系统服务。
Ceph 的主要优点是分布式存储,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,不存在传统的单点故障的问题,可以水平扩展。
Ceph 存储集群至少需要一个 Ceph Monitor 和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器(Metadata Server)。

1.3 特点

Ceph 适合跨集群的小文件存储, 拥有以下特点:
  • 高性能

    Client 和 Server 直接通信, 不需要代理和转发;

    Client 不需要负责副本的复制, 有 Primary 主节点负责, 这样可以有效降低 clien 网络的消耗;

    采用 CRUSH 算法,数据分布均衡,并行度高,支持上千个存储节点, 支持 TB 及 PB 级数据。

  • 高可用性

    数据多副本, 支持故障域分隔,数据强一致性;

    没有单点故障,较好的容错性, 有效支撑各种故障场景;

    支持所有故障的检测和自动恢复,可以做到自动化管理;

    支持并行恢复,能够极大的降低数据恢复时间, 提高数据的可靠性。

  • 高扩展性

    高度并行化设计,没有单个中心控制组件,所有负载都能动态的划分到各个服务器上。

    去中心化、灵活、随节点增加线性增长。

  • 场景丰富

    支持三种存储接口类型:块存储、文件存储、对象存储。同时支持自定义接口,C++ 为底层实现, 兼容多种语言。

    • 块存储:将磁盘空间映射给主机使用, 适用 docker 容器、虚拟机磁盘存储分配;日志存储, 文件存储。

    • 文件存储:解决块存储无法共享问题, 在服务器架设 FTP 和 NFS 服务器,适用目录结构的存储、日志存储等。

    • 对象存储:大容量硬盘, 安装存储管理软件, 对外提供读写访问能力, 具备块存储的高速读写能力, 也具备文件存储共享的特性;适用图片存储或视频存储。

1.4 分布式存储系统横纵对比

对比说明TFSFASTDFSMooseFSGlusterFSCEPH
开发语言C++CCCC++
数据存储方式文件 / Trunk文件 / 块对象 / 文件 / 块
在线扩容支持支持支持支持支持
冗余备份支持支持支持支持支持
单点故障存在不存在存在不存在不存在
易用性安装复杂,官方文档少安装简单,社区相对活跃安装简单,官方文档多安装简单,官方文档专业化安装简单,官方文档专业化
适用场景跨集群的小文件单集群的中小文件单集群的大中文件跨集群云存储单集群的大中小文件

2. Ceph 架构设计

2.1 Ceph 整体设计

  • 基础存储系统 RADOS

    Reliable, Autonomic,Distributed Object Store,即可靠的、自动化的、分布式的对象存储

    这就是一个完整的对象存储系统,所有存储在 Ceph 系统中的用户数据事实上最终都是由这一层来存储的。而 Ceph 的高可靠、高可扩展、高性能、高自动化等等特性本质上也是由这一层所提供的。

  • 基础库 librados

    这层的功能是对 RADOS 进行抽象和封装,并向上层提供 API,以便直接基于 RADOS(而不是整个 Ceph)进行应用开发。特别要注意的是,RADOS 是一个对象存储系统,因此,librados 实现的 API 也只是针对对象存储功能的。RADOS 采用 C++ 开发,所提供的原生 librados API 包括 C 和 C++ 两种。

  • 高层应用接口

    这层包括了三个部分:RADOS GW(RADOS Gateway)、 RBD(Reliable Block Device)和 Ceph FS(Ceph File System),其作用是在 librados 库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。其中,RADOS GW 是一个提供与 Amazon S3 和 Swift 兼容的 RESTful API 的 gateway,以供相应的对象存储应用开发使用。RADOS GW 提供的 API 抽象层次更高,但功能则不如 librados 强大。

  • 应用层

    这层是不同场景下对于 Ceph 各个应用接口的各种应用方式,例如基于 librados 直接开发的对象存储应用,基于 RADOS GW 开发的对象存储应用,基于 RBD 实现的云硬盘等等。librados 和 RADOS GW 的区别在于,librados 提供的是本地 API,而 RADOS GW 提供的则是 RESTfulAPI。

    由于 Swift 和 S3 支持的 API 功能近似,这里以 Swift 举例说明。Swift 提供的 API 功能主要包括:

    • 用户管理操作:用户认证、获取账户信息、列出容器列表等;

    • 容器管理操作:创建 / 删除容器、读取容器信息、列出容器内对象列表等;

    • 对象管理操作:对象的写入、读取、复制、更新、删除、访问许可设置、元数据读取或更新等。

2.2 逻辑架构

2.3 Ceph 专业术语

  • OSD: Ceph 的对象存储设备,OSD 守护进程的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他 OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。

  • Monitors: Ceph 监视器,Monitor 维护着展示集群状态的各种图表,包括监视器图、OSD 图、归置组(PG)图、和 CRUSH 图。

  • PG:Ceph 归置组,每个 Object 最后都会通过 CRUSH 计算映射到某个 PG 中,一个 PG 可以包含多个 Object。

  • MDS: Ceph 元数据服务器(MDS),为 Ceph 文件系统存储元数据。

  • CephFS: Ceph 文件系统,CephFS 提供了一个任意大小且兼容 POSIX 的分布式文件系统。

  • RADOS: Reliable Autonomic Distributed Object Store,表示可靠、自动、分布式的对象存储。Ceph 中的一切都是以对象形式存储,RADOS 就负责存储这些对象,RADOS 层确保数据一致性和可靠性。

  • Librados:librados 库是一种用来简化访问 RADOS 的方法,目前支持 PHP、Python、Ruby、Java、C 和 C++ 语言。

  • RBD:Ceph 的块设备,它对外提供块存储,可以被映射、格式化进而像其他磁盘一样挂载到服务器。

  • RGW/RADOSGW:Ceph 对象网关,它提供了一个兼容 S3 和 Swift 的 restful API 接口。

3. Ceph 集群部署配置

3.1 部署结构

虚拟机创建三台服务器,CENTOS 版本为 7.6, IP 网段 192.168.116.0/24。三台主机名称为:
  • CENTOS7-1: IP 为 192.168.116.141, 既做管理节点, 又做子节点。

  • CENTOS7-2: IP 为 192.168.116.142, 子节点。

  • CENTOS7-3: IP 为 192.168.116.143, 子节点。

3.2 系统配置

系统配置工作, 三台节点依次执行:
  1. 修改主机名称 [root@CENTOS7-1 ~]# vi /etc/hostname

    CENTOS7-1

  2. 编辑 hosts 文件

    192.168.116.141 CENTOS7-1192.168.116.142 CENTOS7-2192.168.116.143 CENTOS7-3
  3. 注意, 这里面的主机名称要和节点名称保持一致, 否则安装的时候会出现问题

  1. 修改 yum 源 vi /etc/yum.repos.d/ceph.repo, 为避免网速过慢问题, 这里采用的是清华镜像源:

    [Ceph]name=Ceph packages for $basearchbaseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/x86_64/enabled=1gpgcheck=1type=rpm-mdgpgkey=https://download.ceph.com/keys/release.asc
    [Ceph-noarch]name=Ceph noarch packages# 官方源#baseurl=http://download.ceph.com/rpm-mimic/el7/noarch# 清华源baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/enabled=1gpgcheck=1type=rpm-mdgpgkey=https://download.ceph.com/keys/release.asc
    [ceph-source]name=Ceph source packagesbaseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/SRPMS/enabled=1gpgcheck=1type=rpm-mdgpgkey=https://download.ceph.com/keys/release.asc
  2. 安装 ceph 与 ceph-deploy 组件

    yum update && yum -y install ceph ceph-deploy
    安装完成, 如果执行 ceph-deploy 出现 ImportError: No module named pkg_resources
    安装 python2-pip:yum -y install python2-pip
    yum install epel-release -y
  3. 安装 NTP 时间同步工具

    yum install ntp ntpdate ntp-doc -y

    确保时区是正确, 设置开机启动:

    systemctl enable ntpd

    并将时间每隔 1 小时自动校准同步。编辑 vi /etc/rc.d/rc.local 追加:

    /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1; /sbin/hwclock -w

    配置定时任务,执行 crontab -e 加入:

    0 */1 * * * ntpdate ntp1.aliyun.com > /dev/null 2>&1; /sbin/hwclock -w

3.3 免密码 SSH 登陆

  1. 官方建议不用系统内置用户, 创建名为 ceph_user 用户, 密码也设为 ceph_user:

    useradd -d /home/ceph_user -m ceph_userpasswd ceph_user
  2. 设置 sudo 权限

    echo "ceph_user ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph_usersudo chmod 0440 /etc/sudoers.d/ceph_user

    1、2 两个步骤依次在三台机器上执行。

    接下来在主节点, 继续执行:

  3. 生成密钥:

    切换用户:su ceph_user

    执行 ssh-keygen,一直按默认提示点击生成 RSA 密钥信息。

  4. 分发密钥至各机器节点

    ssh-copy-id ceph_user@CENTOS7-1ssh-copy-id ceph_user@CENTOS7-2ssh-copy-id ceph_user@CENTOS7-3
  5. 修改管理节点上的 ~/.ssh/config 文件, 简化 SSH 远程连接时的输入信息:

    管理节点是会有 root 和 ceph_user 多个用户, ssh 远程连接默认会以当前用户身份进行登陆,

    如果我们是 root 身份进行远程连接, 还是需要输入密码, 我们想简化, 该怎么处理?

    切换 root 身份,

    su root

    修改~/.ssh/config 文件

    Host CENTOS7-1 Hostname CENTOS7-1 User ceph_userHost CENTOS7-2 Hostname CENTOS7-2 User ceph_userHost CENTOS7-3 Hostname CENTOS7-3 User ceph_user

    注意修改文件权限, 不能采用 777 最大权限:

    chmod 600 ~/.ssh/config

    进行 ssh 远程连接时, Host 的主机名称是区分大小写的, 所以要注意配置文件的主机名称。

  6. 开放端口, 非生产环境, 可以直接禁用防火墙:

    systemctl stop firewalld.servicesystemctl disable firewalld.service
  7. SELINUX 设置

    SELinux 设为禁用:

    setenforce 0

    永久生效:编辑 vi /etc/selinux/config 修改:

    SELINUX=disabled

3.4 集群搭建配置

采用 root 身份进行安装
  1. 在管理节点创建集群配置目录,cd /usr/local:

    mkdir ceph-clustercd ceph-cluster

    注意:此目录作为 ceph 操作命令的基准目录, 会存储处理配置信息。

  2. 创建集群, 包含三台机器节点:

    ceph-deploy new CENTOS7-1 CENTOS7-2 CENTOS7-3
  3. 创建成功后, 会生一个配置文件。

    如果接下来集群的安装配置出现问题, 可以执行以下命令清除, 再重新安装:

    ceph-deploy purge CENTOS7-1 CENTOS7-2 CENTOS7-3ceph-deploy purgedata CENTOS7-1 CENTOS7-2 CENTOS7-3ceph-deploy forgetkeys

    将三台节点的 mon 信息也删除

    rm -rf /var/run/ceph/
  4. 修改配置文件, 有些配置后面需用到:

    vi /usr/local/ceph-cluster/ceph.conf

    加入:

    [global]# 公网网络public network = 192.168.116.0/24# 设置pool池默认分配数量 默认副本数为3osd pool default size = 2# 容忍更多的时钟误差mon clock drift allowed = 2mon clock drift warn backoff = 30# 允许删除poolmon_allow_pool_delete = true[mgr]# 开启WEB仪表盘mgr modules = dashboard

    第一项为副本数, 设为 2 份。

    第二项为对外 IP 访问网段,注意根据实际 IP 修改网段。

    第三、四项为允许一定时间的漂移误差。

  5. 执行安装:

    ceph-deploy install CENTOS7-1 CENTOS7-2 CENTOS7-3

    如果出现错误:

    ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph --version

    可以在各节点上单独进行安装:

    yum -y install ceph

    如果没有仓库文件 ceph.repo, 按上面的步骤手工创建。

  6. 初始 monitor 信息:

    ceph-deploy mon create-initial## ceph-deploy --overwrite-conf mon create-initial

    执行完成后, 会生成以下文件: 

  7. 同步管理信息:

    下发配置文件和管理信息至各节点:

    ceph-deploy admin CENTOS7-1 CENTOS7-2 CENTOS7-3
  8. 安装 mgr (管理守护进程), 大于 12.x 版本需安装, 我们装的是最新版,需执行:

    ceph-deploy mgr create CENTOS7-1 CENTOS7-2 CENTOS7-3
  9. 安装 OSD (对象存储设备)

    注意:新版本的 OSD 没有 prepare 与 activate 命令。

    这里需要新的硬盘作为 OSD 存储设备, 关闭虚拟机, 增加一块硬盘, 不用格式化。

重启, fdisk -l 查看新磁盘名称: 

执行创建 OSD 命令:

ceph-deploy osd create --data /dev/sdb CENTOS7-2

三台节点都需分别依次执行。

ceph-deploy gatherkeys CENTOS7-1
  1. 验证节点:

    输入 ceph health 或 ceph -s 查看, 出现 HEALTH_OK 代表正常。 

通过虚拟机启动,如果出现错误:

[root@CENTOS7-1 ~]# ceph -s cluster: id: 0ec99aa9-e97e-43d3-b5b9-90eb21c4abff health: HEALTH_WARN 1 filesystem is degraded 1 osds down 1 host (1 osds) down Reduced data availability: 41 pgs inactive Degraded data redundancy: 134/268 objects degraded (50.000%), 22 pgs degraded, 87 pgs undersized 39 slow ops, oldest one blocked for 2286 sec, daemons [osd.0,mon.CENTOS7-2,mon.CENTOS7-3] have slow ops. clock skew detected on mon.CENTOS7-2, mon.CENTOS7-3 services: mon: 3 daemons, quorum CENTOS7-1,CENTOS7-2,CENTOS7-3 mgr: centos7-1(active), standbys: centos7-3, centos7-2 mds: fs_test-1/1/1 up {0=centos7-1=up:replay} osd: 3 osds: 1 up, 2 in data: pools: 9 pools, 128 pgs objects: 134 objects, 64 KiB usage: 1.0 GiB used, 19 GiB / 20 GiB avail pgs: 32.031% pgs unknown 134/268 objects degraded (50.000%) 65 active+undersized 41 unknown 22 active+undersized+degraded

在各节点执行命令,确保时间同步一致:

ntpdate ntp1.aliyun.com

3.5 安装管理后台

  1. 开启 dashboard 模块

    ceph mgr module enable dashboard
  2. 生成签名

    ceph dashboard create-self-signed-cert
  3. 创建目录

    mkdir mgr-dashboard

    [root@CENTOS7-1 mgr-dashboard]# pwd/usr/local/ceph-cluster/mgr-dashboard
  4. 生成密钥对

    cd /usr/local/ceph-cluster/mgr-dashboard
    openssl req -new -nodes -x509 -subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650 -keyout dashboard.key -out dashboard.crt -extensions v3_ca
    [root@CENTOS7-1 mgr-dashboard]# lltotal 8-rw-rw-r-- 1 ceph_user ceph_user 1155 Jul 14 02:26 dashboard.crt-rw-rw-r-- 1 ceph_user ceph_user 1704 Jul 14 02:26 dashboard.key
  5. 启动 dashboard

    ceph mgr module disable dashboardceph mgr module enable dashboard
  6. 设置 IP 与 PORT

    ceph config set mgr mgr/dashboard/server_addr 192.168.116.141ceph config set mgr mgr/dashboard/server_port 18843
  7. 关闭 HTTPS

    ceph config set mgr mgr/dashboard/ssl false
  8. 查看服务信息

    [root@CENTOS7-1 ceph-cluster]# ceph mgr services{ "dashboard": "http://192.168.116.142:18843/"}
  9. 设置管理用户与密码

    ceph dashboard set-login-credentials admin admin
  10. 访问

3.6 创建 Cephfs

集群创建完后, 默认没有文件系统, 我们创建一个 Cephfs 可以支持对外访问的文件系统。

ceph-deploy --overwrite-conf mds create CENTOS7-1 CENTOS7-2 CENTOS7-3


  1. 创建两个存储池,执行两条命令:

    ceph osd pool create cephfs_data 128ceph osd pool create cephfs_metadata 64

    少于 5 个 OSD 可把 pg_num 设置为 128

    OSD 数量在 5 到 10,可以设置 pg_num 为 512

    OSD 数量在 10 到 50,可以设置 pg_num 为 4096

    OSD 数量大于 50,需要计算 pg_num 的值

    通过下面命令可以列出当前创建的存储池:

    ceph osd lspools
  2. 创建 fs, 名称为 fs_test:

    ceph fs new fs_test cephfs_metadata cephfs_data
  3. 状态查看, 以下信息代表正常:

    [root@CENTOS7-1 mgr-dashboard]# ceph fs lsname: fs_test, metadata pool: cephfs_metadata, data pools: [cephfs_data ][root@CENTOS7-1 mgr-dashboard]# ceph mds statfs_test-1/1/1 up {0=centos7-1=up:active}

    附:如果创建错误, 需要删除, 执行:

    ceph fs rm fs_test --yes-i-really-mean-itceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it

    确保在 ceph.conf 中开启以下配置:

    [mon]mon allow pool delete = true
  4. 采用 fuse 挂载

    先确定 ceph-fuse 命令能执行, 如果没有, 则安装:

    yum -y install ceph-fuse

  5. 创建挂载目录

    mkdir -p /usr/local/cephfs_directory

  6. 挂载 cephfs

    [root@node3 ~]# ceph-fuse -k /etc/ceph/ceph.client.admin.keyring -m 192.168.116.141:6789 /usr/local/cephfs_directoryceph-fuse[6687]: starting ceph client2019-07-14 21:39:09.644181 7fa5be56e040 -1 init, newargv = 0x7fa5c940b500 newargc=9ceph-fuse[6687]: starting fuse
  7. 查看磁盘挂载信息

    [root@CENTOS7-1 mgr-dashboard]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/centos-root 38G 3.0G 35G 8% /devtmpfs 1.9G 0 1.9G 0% /devtmpfs 1.9G 0 1.9G 0% /dev/shmtmpfs 1.9G 20M 1.9G 2% /runtmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup/dev/sda1 197M 167M 31M 85% /boottmpfs 378M 0 378M 0% /run/user/0tmpfs 1.9G 24K 1.9G 1% /var/lib/ceph/osd/ceph-0ceph-fuse 27G 0 27G 0% /usr/local/cephfs_directorytmpfs 378M 0 378M 0% /run/user/1000

    /usr/local/cephfs_directory 目录已成功挂载。

3.7 客户端连接验证 (Rados Java)

  1. 安装好 JDK、GIT 和 MAVEN。

  2. 下载 rados java 客户端源码

    git clone https://github.com/ceph/rados-java.git

    下载目录位置:

    [root@CENTOS7-1 rados-java]# pwd/usr/local/sources/rados-java
  3. 执行 MAVEN 安装,忽略测试用例:

    [root@CENTOS7-1 rados-java]# mvn install -Dmaven.test.skip=true

    生成 jar 包, rados-0.7.0.jar

    [root@CENTOS7-1 target]# ll总用量 104drwxr-xr-x 3 root root 17 8月 11 18:32 classesdrwxr-xr-x 2 root root 27 8月 11 18:32 dependenciesdrwxr-xr-x 3 root root 25 8月 11 18:32 generated-sourcesdrwxr-xr-x 2 root root 28 8月 11 18:32 maven-archiverdrwxr-xr-x 3 root root 35 8月 11 18:32 maven-status-rw-r--r-- 1 root root 105701 8月 11 18:32 rados-0.7.0.jar
  4. 创建软链接, 加入 CLASSPATH

    ln -s /usr/local/sources/rados-java/target/rados-0.7.0.jar /opt/jdk1.8.0_301/jre/lib/ext/rados-0.7.0.jar

    安装 jna

    yum -y install jna

    创建软链接

    ln -s /usr/share/java/jna.jar /opt/jdk1.8.0_301/jre/lib/ext/jna.jar

    查看

    [root@CENTOS7-1 target]# ll /opt/jdk1.8.0_301/jre/lib/ext/jna.jarlrwxrwxrwx 1 root root 23 8月 11 19:00 /opt/jdk1.8.0_301/jre/lib/ext/jna.jar -> /usr/share/java/jna.jar
    [root@CENTOS7-1 target]# ll /opt/jdk1.8.0_301/jre/lib/ext/jna.jarlrwxrwxrwx 1 root root 23 8月 11 19:00 /opt/jdk1.8.0_301/jre/lib/ext/jna.jar -> /usr/share/java/jna.jar
  5. 创建 JAVA 测试类

    CephClient 类,注意, 最新版 0.6 的异常处理包位置已发生变化。

    import com.ceph.rados.Rados;import com.ceph.rados.exceptions.*;
    import java.io.File;
    public class CephClient { public static void main (String args[]){
    try { Rados cluster = new Rados("admin"); System.out.println("Created cluster handle.");
    File f = new File("/etc/ceph/ceph.conf"); cluster.confReadFile(f); System.out.println("Read the configuration file.");
    cluster.connect(); System.out.println("Connected to the cluster.");
    } catch (RadosException e) { System.out.println(e.getMessage() + ": " + e.getReturnValue()); } }}
  6. 运行验证

    需要在 linux 环境下运行,且要在 client 节点。

    编译并运行:

    [root@CENTOS7-1 sources]# javac CephClient.java [root@CENTOS7-1 sources]# java CephClientCreated cluster handle.Read the configuration file.Connected to the cluster.
  7. 成功与 ceph 建立连接。

    注意:如果 java 和 javac 版本不同,可以使用 rpm -qa |grep java 进行查找, rpm -e --nodeps jdk 进行删除,source /etc/profile 进行生效

    jdk 的位数为 64 位


END



往期推荐



14个SpringBoot优化小妙招,看完后同事说写代码像写诗!

重试框架 Spring-Retry 和 Guava-Retry,你知道该怎么选吗?

公司新来一个同事,把 @Transactional 事务注解运用得炉火纯青!

构建 Java 镜像的 10 个最佳实践

Java 近期大事汇总:JDK 19-RC1、Spring 更新、Micronaut、Helidon、Payara 等


关注后端面试那些事,回复【2022面经】

获取最新大厂Java面经


最后重要提示:高质量的技术交流群,限时免费开放,今年抱团最重要。想进群的,关注SpringForAll社区,回复关键词:加群,拉你进群。

点击这里领取2022大厂面经


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存